/*
    for 
    for in
    for of 
    .forEach
    .map
    .some
    .every
    .filter
    .reduce
*/

//-----------------------------------------------------------------------------------------------------------------------------------------------
// for in 和 for of 的区别
/*
    for/in以任意顺序遍历一个对象的除Symbol以外的可枚举属性______for/in一般用来遍历对象
    for/of在可迭代对象（Array Map Set String TypedArray arguments对象等等）上创建一个迭代循环，
        调用自定义迭代钩子，并为每个不同属性的值执行语句________for/of一般用来遍历数组 [for/of 是无法遍历一个对象的]


        注意：
        - for/in 无序，遍历时需要注意
        - 可枚举：可枚举属性是指那些内部 “可枚举” 标志设置为 true 的属性，
                    对于通过直接的赋值和属性初始化的属性，该标识值默认为即为 true，
                    对于通过 Object.defineProperty 等定义的属性，该标识值默认为 false
*/

// 遍历对象
let obj = {
    id: '1',
    name: 'Katrina',
};

// 用for/in遍历对象
for (let key in obj) {
    console.log(key);   // id  name
} 

// 用for/of遍历对象
for (let key of obj) {     
    console.log(key);    // TypeError: obj is not iterable
};

// 遍历数组
let arr = [5,6,7,8,9,10];
// 注意：数组也是一个特殊的对象，我给数组增加一个属性
arr.name = 'james'; 

// 用for/in遍历数组
for (let item in arr) {
    console.log(item);   //  Output 打印数组索引和name属性值（注意）！0 1 2 3 4 5 james
};


// 用for/of遍历数组
for (let item of arr) {
    console.log(item);  // Output 只打印数组每个元素 5 6 7 8 9 10
};



//-----------------------------------------------------------------------------------------------------------------------------------------------
// .map和.forEach的区别
/*
    .map()方法返回一个新的数组，并且按照原始数组元素顺序处理函数，新数组中的元素为原始数组元素调用回调函数处理后的值【不改变原数组】
    .forEach()方法没有返回值，用于调用数组的每个元素，并将元素传递给回调函数【改变原数组】
*/


//-----------------------------------------------------------------------------------------------------------------------------------------------
// 中断数组遍历的方法
/*
    break
    throw
    return
    continue（立即结束本次循环continue后面代码不执行，进入下一轮循环，算是中止当前循环，勉强也算）
*/
// 哪些遍历方法可以中断
/*
    for
    for/of
    .some
    .every
*/
// 1. for
// for break
let ary = [1, 2, 3, 4, 5];
for (let i=0; i< ary.length; i++) {
    console.log(i);
    if(i === 3) {break;};
};

// Output

// 0
// 1
// 2
// 3

// --------------------------

// for continue
for (let i=0; i< ary.length; i++) {
    console.log('before=', i);
    if(i === 3) {continue;};
    console.log('after=', i);
};

// Output 注意没有 after=3

// before= 0
// after= 0
// before= 1
// after= 1
// before= 2
// after= 2
// before= 3
// before= 4
// after= 4

// 2. for/in
// for/of break
let ary = [1, 2, 3, 4, 5];
for (let o of ary) {
    console.log(o);
    if(o === 3) {break;};
};

// Output

// 1
// 2
// 3

// --------------------------

// for/of continue
for (let o of ary) {
    console.log('before=', o);
    if(o === 3) {continue;};
    console.log('after=', o);
};

// Output 注意没有 after=3

// before= 1
// after= 1
// before= 2
// after= 2
// before= 3
// before= 4
// after= 4
// before= 5
// after= 5

// 3. .some .every中断只能用return


